﻿namespace FastEasyAPI.Filter
{
    public class GlobalExceptionFilter : IExceptionFilter
    {
        //构造注入Nlog
        private readonly ILogger<GlobalExceptionFilter> logger;

        public GlobalExceptionFilter(ILogger<GlobalExceptionFilter> _)
        {
            logger = _;
        }

        //实现接口,对异常进行处理
        public void OnException(ExceptionContext context)
        {
            //记录异常到日志
            StringBuilder exMsg = new();
            exMsg.AppendLine($"【异常方法:】{context.HttpContext.Request.Path}");
            exMsg.AppendLine($"【请求类型:】{context.HttpContext.Request.Method}");
            exMsg.AppendLine($"【异常错误:】{context.Exception.Message}");
            exMsg.AppendLine($"【堆栈跟踪:】{context.Exception.StackTrace}");
            logger.LogError(exMsg.ToString());

            // 创建自定义错误响应
            var result = new ObjectResult(new { error = context.Exception.Message })
            {
                StatusCode = 400, // 设置适当的HTTP状态码
                DeclaredType = typeof(object) // 声明类型，以确保内容被正确序列化
            };

            // 取消异常的传播，以防止默认的500错误
            context.ExceptionHandled = true;
            // 设置响应结果
            context.Result = result;
        }
    }

    /// <summary>
    /// 自定义异常类型
    /// 程序级错误:例如数据库访问错误
    /// 异常不处理建议用此类型
    /// </summary>
    public class ExFromService : Exception
    {
        public ExFromService() : base()
        {
        }

        public ExFromService(string message) : base(message)
        {
        }

        public ExFromService(string message, Exception exception) : base(message, exception)
        {
        }
    }

    /// <summary>
    /// 自定义异常类型
    /// 用户级错误:例如参数问题等
    /// 异常已处理建议用此类型
    /// </summary>
    public class ExFromClient : Exception
    {
        public ExFromClient() : base()
        {
        }

        public ExFromClient(string message) : base(message)
        {
        }

        public ExFromClient(string message, Exception exception) : base(message, exception)
        {
        }
    }
}